package com.sky.sky_server.service.impl;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.sky_common.constant.PasswordConstant;
import com.sky.sky_common.constant.StatusConstant;
import com.sky.sky_common.context.BaseContext;
import com.sky.sky_pojo.dto.EmployeeDTO;
import com.sky.sky_pojo.entity.Employee;
import com.sky.sky_pojo.entity.EmployeeQueryPage;
import com.sky.sky_pojo.entity.PageResult;
import com.sky.sky_server.mapper.EmployeeMapper;
import com.sky.sky_server.service.EmployeeService;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class EmployeeServiceImpl implements EmployeeService{

    @Autowired
    private EmployeeMapper employeeMapper;

    /**
     * 新增员工
     */
    @Override
    public int save(EmployeeDTO employeeDTO) {

        // 对象属性拷贝
        Employee employee = new Employee();
        // 将前者的属性值赋给后者，前提是属性名相同
        BeanUtils.copyProperties(employeeDTO, employee);

        // 设置默认密码
        String md5String = DigestUtils.md5DigestAsHex(PasswordConstant.PASSWORD.getBytes()); // 将密码进行MD5加密
        employee.setPassword(md5String);

        // 设置默认状态
        employee.setStatus(StatusConstant.ENABLE);

        // 设置修改时间为当前时间
        employee.setUpdateTime(LocalDateTime.now());
        // 设置创建时间为当前时间
        employee.setCreateTime(LocalDateTime.now());

        Long empId = BaseContext.getCurrentId();
        // todo ThreadLocal 的删除应该不能再这里，应该放在 Controller 层或更前面，写这里也没有用，因为每次请求都会存入
        BaseContext.remove();
        // 设置创建人为当前登录用户
        employee.setCreateUser(empId);
        employee.setUpdateUser(empId);

        // todo 可以增加一个校验数据合法性的逻辑，并统一抛出数据不合法异常，方案：实体/DTO 加 Bean Validation 校验,比如身份证长度

        return employeeMapper.insert(employee);
    }

    /**
     * 分页查询员工列表
     */
    @Override
    public PageResult<Employee> page(EmployeeQueryPage ePage) {
        log.info("开始分页查询员工列表");

        // 设置分页参数
        PageHelper.startPage(ePage.getPage(), ePage.getPageSize());
        
        // 查询员工列表
        // todo 这里是涉及到了单表的查询，只是简单返回了用户信息，如果以后需要返回更多信息，还需要查询其他表，再增加DTO类
        List<Employee> employeeList = employeeMapper.findAllEmployee(ePage);
        Page<Employee> page = (Page<Employee>) employeeList;

        // 封装结果
        List<Employee> res = page.getResult();
        page.close();

        return new PageResult<Employee>(page.getTotal(), res);

    }

    /**
     * 修改员工状态
     */
    @Override
    public int changeStatus(Integer status, Long id) {
        // tag 在mapper中，定义一个更通用化的更新方法，也就是动态sql语法，这样就可以不用写多个方法了
        // Employee emp = new Employee();
        // emp.setStatus(status);
        // emp.setId(id);
        Employee emp = Employee.builder().status(status).id(id).build();

        return employeeMapper.update(emp);
    }

    /**
     * 根据id查询员工
     */
    @Override
    public Employee getEmployeeById(Long id) {
        Employee emp = employeeMapper.findById(id);
        emp.setPassword("******");
        return emp;
    }

    /**
     * 修改员工信息
     */
    @Override
    public int update(EmployeeDTO employeeDTO) {
        Employee emp = new Employee();

        // 修改员工信息
        emp.setUpdateTime(LocalDateTime.now());
        Long userId = BaseContext.getCurrentId();
        emp.setUpdateUser(userId);

        BeanUtils.copyProperties(employeeDTO, emp);
        return employeeMapper.update(emp);
    }
    
}
